#include "log_in.h"

/*
用户名 log_in
参数
    name  用户
    my_pos   密码
返回值
    无
功能
    实现登陆功能
        用户通过输入 账号密码 本函数进行判断
        如果3次错误 则等待 5 s 然后重新输入
        直到输入正确 然后退出
*/
void log_in(char (*name)[128], char *my_pos)
{
    system("clear");
    char in_name[128] = " "; // 用户输入的账号
    char in_pos[128] = " ";  // 用户输入的密码

    int flag_1 = 0;
    int num = 0; // 用于记录输入错误的次数
    /*
    flag_1 = -98  账号正确
    flag_1 = -99  账号错误
    */
    while (1)
    {

        puts("请输入你的账号");
        scanf("%s", in_name);
        for (size_t i = 0; i < 10; i++)
        {
            if (!strcmp(in_name, name[i]))
            {
                puts("账号正确");
                flag_1 = -98; // 账号正确
                break;
            }
            if (i == 9) // 这里有bug
            {
                puts("账号错误");
                flag_1 = -99; // 账号错误
                num++;        // 记录用户输入错误的次数
            }
        }

        if (flag_1 == -98)
        {
            puts("请输入你的密码");
            scanf("%s", in_pos);
            if (!strcmp(in_pos, my_pos))
            {
                printf("恭喜这位帅哥登陆成功\n");
                return;
            }
            else
            {
                puts("密码错误");
                num++;
            }
        }

        if (num == 3)
        {
            num = 0;                // 错误次数请0
            Progress_Bar(0, 0, 10); // 打印进度条
        }
    }
}

/*
用户名 Progress_yBar
参数
    @x              想要显示的位置 x
    @y              想要显示的位置 y
    @time_length    想要延时的时间
返回值
    无
功能
    进度条功能
*/
void Progress_Bar(int x, int y, float time_length)
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = ((time_length / 100) * flag) * 100;
        printf("%.2f%%\n", percent);
        temp += 0.01;
        flag += 0.01;
        if (fabs((flag - 0.01) - time_length) < EPSILON)
        {
            break;
        }
        // printf("\n%d", num);

        fflush(stdout);
        usleep(10000);
        system("clear");
    }
    system("clear");
}

// 定义三个函数，分别对应三个选项的功能
void option1() //猜数字
{
    // 设置随机数种子
    srand(time(NULL));

    // 生成一个0到RAND_MAX之间的随机数
    int random_number = rand() % 100 + 1;

    int a = 0;
    int Max = 100;
    int Min = 0;

    while (1)
    {
        printf("猜：");
        scanf("%d", &a);

        if (a >= Max || a <= Min)
        {
            printf("gg\n");
            continue;
        }
        if (a == random_number)
        {
            printf("对了\n");
            break;
        }
        else if (a > random_number)
        {
            Max = a;
            printf("大了，在[%d,%d]之间\n", Min, Max);
        }
        else if (a < random_number)
        {
            Min = a;
            printf("小了，在[%d,%d]之间\n", Min, Max);
        }
    }
}

void option2()   //可控金字塔
{
    int m,n,j,k;

    printf("请输入你要的层数");
    scanf("%d",&m);

    for(n = 1;n <= m;++n)
    {
       for(j = 1;j <= m - n ;++j)
       {
           printf(" ");
       }
       
       for(k = 1;k <= 2 * n - 1;++k)
       {
           printf("*");
       }
       printf("\n");
   
    }
}



void print_grade(int grade)  //成绩等级
{
    if (grade >= 90 && grade <= 100)
    {
        printf("A");
    }
    else if (grade >= 80 && grade < 90)
    {
        printf("B");
    }
    else if (grade >= 70 && grade < 80)
    {
        printf("C");
    }
    else if (grade >= 60 && grade < 70)
    {
        printf("D");
    }
    else if (grade >= 0 && grade < 60)
    {
        printf("E");
    }
    else
    {
        printf("sb");
    }
}

void option3() //随机生成学生成绩并排序
{
    int a;
    int random_number[20];
    // 设置随机数种子
    srand(time(NULL));

    for (int i = 0; i < 20; i++)
    {
        random_number[i] = rand() % 100 + 1;
    }

    // 对随机数数组进行排序
    for (int i = 0; i < 20; i++)
    {
        for (int j = i + 1; j < 20; j++)
        {
            if (random_number[i] > random_number[j])
            {
                int temp = random_number[i];
                random_number[i] = random_number[j];
                random_number[j] = temp;
            }
        }
    }

    // 打印排序后的随机数数组
    for (int i = 0; i < 20; i++)
    {
        printf("%d ", random_number[i]);
        print_grade(random_number[i]);
        printf("\n");
    }
}



//菜单
int choice()
{
    int choice;

    while (1)
    {
        // 显示菜单
        printf("请选择一个选项：\n");
        printf("1. 猜数字\n");
        printf("2. 可控金字塔\n");
        printf("3. 随机生成学生成绩排序\n");
        printf("0. 退出\n");
        printf("请输入你的选择：\n");
        scanf("%d", &choice);

        // 根据用户的输入调用相应的函数
        switch (choice)
        {
        case 1:
            option1();
            break;
        case 2:
            option2();
            break;
        case 3:
            option3();
            break;
        case 0:
            printf("退出程序");
            break;
        default:
            printf("无效的选择，请重新输入");
        }
        break;
    }

    return 0;
}
